<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main API documentation</title>
<meta name="description" content="This is an example of a panel (type=&#34;static&#34;), they will be updated if they are open.
If you need to make a plugin that is updated in the bg then …" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/ir-black.min.css" crossorigin>
<style>
:root {
--highlight-color: #202;
}
html {
scrollbar-face-color: #646464;
scrollbar-base-color: #646464;
scrollbar-3dlight-color: #646464;
scrollbar-highlight-color: #646464;
scrollbar-track-color: #000;
scrollbar-arrow-color: #000;
scrollbar-shadow-color: #646464;
scrollbar-dark-shadow-color: #646464;
}
::-webkit-scrollbar { width: 14px; height: 3px;}
::-webkit-scrollbar-button {
background-color: #000;
height: 3px;}
::-webkit-scrollbar-track {
background-color: #646464;}
::-webkit-scrollbar-track-piece { background-color: #000;}
::-webkit-scrollbar-thumb { height: 50px; background-color: #666; border-radius: 7px;}
::-webkit-scrollbar-corner { background-color: #646464;}
::-webkit-resizer { background-color: #666;}
.flex {
display: flex !important;
}
body {
line-height: 1.5em;
color: #fff;
background-color: #1e1e1e;
font: 14px/1.5 Helvetica, Arial, sans-serif;
margin: 0;
padding: 0;
}
#content {
padding: 20px;
}
#sidebar {
padding: 30px;
overflow: hidden;
}
#sidebar>*:last-child {
margin-bottom: 2cm;
}
.http-server-breadcrumbs {
font-size: 130%;
margin: 0 0 15px 0;
}
#footer {
font-size: .75em;
padding: 5px 30px;
border-top: 1px solid #fff;
text-align: right;
}
#footer p {
margin: 0 0 0 1em;
display: inline-block;
}
#footer p:last-child {
margin-right: 30px;
}
h1,
h2,
h3,
h4,
h5 {
font-weight: 300;
color: #fff;
}
h1 {
font-size: 2.5em;
line-height: 1.1em;
}
h2 {
font-size: 1.75em;
margin: 1em 0 .50em 0;
}
h3 {
font-size: 1.4em;
margin: 25px 0 10px 0;
}
h4 {
margin: 0;
font-size: 105%;
}
h1:target,
h2:target,
h3:target,
h4:target,
h5:target,
h6:target {
background: #1e1e1e;
padding: 0.2em 0;
}
a {
color: #8fd6fc;
text-decoration: none;
transition: color .3s ease-in-out;
}
a:hover {
color: #00a4fc;
}
.title code {
font-weight: bold;
}
h2[id^="header-"] {
margin-top: 2em;
}
.ident {
color: #f6fc85;
}
strong {
color: #8fd6fc;
}
pre code {
background: transparent;
font-size: .8em;
line-height: 1.4em;
}
code {
background: rgba(255, 255, 255, 0.1);
padding: 1px 4px;
overflow-wrap: break-word;
}
h1 code {
background: transparent
}
pre {
background: transparent;
border: 0;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
margin: 1em 0;
padding: 1ex;
}
#http-server-module-list {
display: flex;
flex-flow: column;
}
#http-server-module-list div {
display: flex;
}
#http-server-module-list dt {
min-width: 10%;
}
#http-server-module-list p {
margin-top: 0;
}
.toc ul,
#index {
list-style-type: none;
margin: 0;
padding: 0;
}
#index code {
background: transparent;
}
#index h3 {
border-bottom: 1px solid #ddd;
}
#index ul {
padding: 0;
}
#index h4 {
margin-top: .6em;
font-weight: bold;
}
/* Make TOC lists have 2+ columns when viewport is wide enough.
Assuming ~20-character identifiers and ~30% wide sidebar. */
@media (min-width: 200ex) {
#index .two-column {
column-count: 2
}
}
@media (min-width: 300ex) {
#index .two-column {
column-count: 3
}
}
dl {
margin-bottom: 2em;
}
dl dl:last-child {
margin-bottom: 4em;
}
dd {
margin: 0 0 1em 3em;
}
#header-classes+dl>dd {
margin-bottom: 3em;
}
dd dd {
margin-left: 2em;
}
dd p {
margin: 10px 0;
}
.name {
background: #000;
font-weight: bold;
font-size: .85em;
padding: 5px 10px;
display: inline-block;
min-width: 40%;
}
.name:hover {
background: #0b0b0b;
}
dt:target .name {
background: var(--highlight-color);
}
.name>span:first-child {
white-space: nowrap;
}
.name.class>span:nth-child(2) {
margin-left: .4em;
}
.inherited {
color: #999;
border-left: 5px solid #eee;
padding-left: 1em;
}
.inheritance em {
font-style: normal;
font-weight: bold;
}
.pydefname {
color: #f90;
}
/* Docstrings titles, e.g. in numpydoc format */
.desc h2 {
font-weight: 400;
font-size: 1.25em;
}
.desc h3 {
font-size: 1em;
}
.desc dt code {
background: inherit;
/* Don't grey-back parameters */
}
.source summary,
.git-link-div {
color: #666;
text-align: right;
font-weight: 400;
font-size: .8em;
text-transform: uppercase;
}
.source summary>* {
white-space: nowrap;
cursor: pointer;
}
.git-link {
color: inherit;
margin-left: 1em;
}
.source pre {
max-height: 500px;
overflow: auto;
margin: 0;
}
.source pre code {
font-size: 12px;
overflow: visible;
}
.hlist {
list-style: none;
}
.hlist li {
display: inline;
}
.hlist li:after {
content: ',\2002';
}
.hlist li:last-child:after {
content: none;
}
.hlist .hlist {
display: inline;
padding-left: 1em;
}
img {
max-width: 100%;
}
td {
padding: 0 .5em;
}
.admonition {
padding: .1em .5em;
margin-bottom: 1em;
}
.admonition-title {
font-weight: bold;
}
.admonition.note,
.admonition.info,
.admonition.important {
background: #00a;
}
.admonition.todo,
.admonition.versionadded,
.admonition.tip,
.admonition.hint {
background: #050;
}
.admonition.warning,
.admonition.versionchanged,
.admonition.deprecated {
background: #ec0;
}
.admonition.error,
.admonition.danger,
.admonition.caution {
background: #c20010;
}
p {
color: #fff;
}
</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main</code></h1>
</header>
<section id="section-intro">
<p>This is an example of a panel (type="static"), they will be updated if they are open.
If you need to make a plugin that is updated in the bg then check the Plugin example!</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;
This is an example of a panel (type=&#34;static&#34;), they will be updated if they are open.
If you need to make a plugin that is updated in the bg then check the Plugin example!
&#34;&#34;&#34;


from plugins.plugin import PluginInformation
from src.logger import print

PluginInfo = PluginInformation(
    name=&#34;Performance&#34;, # This needs to match the folder name under plugins (this would mean plugins\Panel\main.py)
    description=&#34;Will display current app performance.&#34;,
    version=&#34;0.1&#34;,
    author=&#34;Tumppi066&#34;,
    url=&#34;https://github.com/Tumppi066/Euro-Truck-Simulator-2-Lane-Assist&#34;,
    type=&#34;static&#34; # = Panel
)

import tkinter as tk
from tkinter import ttk
import src.helpers as helpers
import src.mainUI as mainUI
import src.variables as variables
import src.settings as settings
import os
import psutil
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import time

frames = []
idleTime = []
lastUpdateTime = time.time()
updateRate = 0.25
lastTheme = settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;)
if lastTheme == None: lastTheme = &#34;dark&#34;

class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.once = False
            mainUI.resizeWindow(900,600)
            self.main()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        def tabFocused(self):
            mainUI.resizeWindow(900,600)

        def updateAxis(self):
            try:
                # Update the axis using blitting to avoid redrawing the whole graph
                # the data is updated in the frames list
                self.line.set_ydata(frames)
                self.line.set_xdata(range(len(frames)))
                self.idleLine.set_ydata(idleTime)
                self.idleLine.set_xdata(range(len(idleTime)))
                self.ax.draw_artist(self.ax.patch)
                self.ax.draw_artist(self.line)
                self.ax.draw_artist(self.idleLine)
                
                self.canvas.blit(self.ax.bbox)
                self.canvas.flush_events()
            except:
                pass
            
        def createGraph(self):
            
            # Try and delete the old graph if it exists
            try:
                self.canvas.get_tk_widget().destroy()
                del self.canvas
                del self.fig
                del self.ax
                del self.line
                
            except: pass
            
            try:
                background = &#34;#313131&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#313131&#34;
                foreground = &#34;#ffffff&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#ffffff&#34;
                graphColor = &#34;#51b7eb&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#51b7eb&#34;
                idleTimeColor = &#34;#ff0000&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#ff0000&#34;
                
                # Make a frametime graph (also support blitting)
                self.fig, self.ax = plt.subplots()
                self.fig.set_size_inches(7, 2)
                # &#34;Remove&#34; the white space around the graph
                self.fig.set_facecolor(background) # Set the background color
                self.ax.set_facecolor(background) # Set the background color
                self.ax.tick_params(axis=&#39;x&#39;, colors=foreground) # Set the axis text color to white
                self.ax.tick_params(axis=&#39;y&#39;, colors=foreground) # Set the axis text color to white
                # Remove the small black lines around the graph
                self.ax.spines[&#39;bottom&#39;].set_color(background)
                self.ax.spines[&#39;top&#39;].set_color(background)
                self.ax.spines[&#39;right&#39;].set_color(background)
                self.ax.spines[&#39;left&#39;].set_color(background)
                
                self.ax.set_ylabel(&#34;Time (ms) Idle (%)&#34;)
                self.ax.yaxis.label.set_color(foreground)
                
                self.ax.set_ylim(0, 100)
                self.ax.set_xlim(0, 100)
                self.ax.set_autoscale_on(False)
                
                self.line, = self.ax.plot(frames, color=graphColor)
                self.idleLine, = self.ax.plot(idleTime, color=idleTimeColor)
                
                self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
                self.canvas.get_tk_widget().grid(row=0, column=0, padx=0, pady=10)
                self.canvas.draw()
            except:
                pass
            
            
        def main(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=700, height=750, border=0, highlightthickness=0)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            # Helpers provides easy to use functions for creating consistent widgets!
            self.fps = helpers.MakeLabel(self.root, &#34;&#34;, 1,0, font=(&#34;Roboto&#34;, 20, &#34;bold&#34;), padx=30, pady=5, columnspan=1)
            self.cpu = helpers.MakeLabel(self.root, &#34;&#34;, 2,0, font=(&#34;Roboto&#34;, 12), padx=30, pady=2, columnspan=1)
            # Make the list of plugins and their frametimes (can&#39;t be a treeview since that is too slow)
            self.list = tk.Text(self.root, width=60, height=14, font=(&#34;Consolas&#34;, 10))
            self.list.grid(row=3, column=0, padx=30, pady=0, columnspan=1)
            helpers.MakeLabel(self.root, &#34;* all information is for the last frame&#34;, 5,0, font=(&#34;Roboto&#34;, 10), padx=30, pady=10)
            
            self.createGraph()
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        def update(self, data): # When the panel is open this function is called each frame 
            global frames
            global lastUpdateTime
            global lastTheme
            global idleTime
            
            data = data[&#34;last&#34;] # Get last frame&#39;s data
            try:
                lastFrameTime = data[&#34;executionTimes&#34;][&#34;all&#34;]
                fps = 1/lastFrameTime
                ms = lastFrameTime*1000
                self.fps.set(f&#34;{round(fps)} fps ({round(ms, 1)} ms)&#34;)
                
                frames.append(ms)
                if len(frames) &gt; 100:
                    frames.pop(0)
                
                if(time.time() - lastUpdateTime &gt; updateRate):
                    lastUpdateTime = time.time()
                    # Clear the text box and add the new data
                    self.list.delete(&#34;1.0&#34;, &#34;end&#34;)
                    for plugin in data[&#34;executionTimes&#34;]:
                        # Take into account the width to make the values line up 
                        listObject = f&#34;{plugin}:&#34;
                        listObject += &#34; &#34;*(50-len(listObject))
                        listObject += f&#34;{int(data[&#39;executionTimes&#39;][plugin]*1000)} ms&#34;
                        self.list.insert(&#34;end&#34;, listObject + &#34;\n&#34;)

                try:
                    self.updateAxis()
                except Exception as ex:
                    print(ex.args)
                    pass

                try:
                    self.cpu.set(f&#34;Idle Time: {round((data[&#39;executionTimes&#39;][&#39;FPSLimiter&#39;] / lastFrameTime) * 100)}%&#34;)
                    idleTime.append((data[&#39;executionTimes&#39;][&#39;FPSLimiter&#39;] / lastFrameTime) * 100)
                    
                    if len(idleTime) &gt; 100:
                        idleTime.pop(0)
                except:
                    idleTime = []
                    
            except Exception as ex:
                print(ex.args)
    
            if(lastTheme != settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;)):
                lastTheme = settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;)
                self.createGraph()
    
            self.root.update()
            
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI"><code class="flex name class">
<span>class <span class="ident">UI</span></span>
<span>(</span><span>master)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class UI():
    try: # The panel is in a try loop so that the logger can log errors if they occur
        
        def __init__(self, master) -&gt; None:
            self.master = master # &#34;master&#34; is the mainUI window
            self.once = False
            mainUI.resizeWindow(900,600)
            self.main()
        
        def destroy(self):
            self.done = True
            self.root.destroy()
            del self

        def tabFocused(self):
            mainUI.resizeWindow(900,600)

        def updateAxis(self):
            try:
                # Update the axis using blitting to avoid redrawing the whole graph
                # the data is updated in the frames list
                self.line.set_ydata(frames)
                self.line.set_xdata(range(len(frames)))
                self.idleLine.set_ydata(idleTime)
                self.idleLine.set_xdata(range(len(idleTime)))
                self.ax.draw_artist(self.ax.patch)
                self.ax.draw_artist(self.line)
                self.ax.draw_artist(self.idleLine)
                
                self.canvas.blit(self.ax.bbox)
                self.canvas.flush_events()
            except:
                pass
            
        def createGraph(self):
            
            # Try and delete the old graph if it exists
            try:
                self.canvas.get_tk_widget().destroy()
                del self.canvas
                del self.fig
                del self.ax
                del self.line
                
            except: pass
            
            try:
                background = &#34;#313131&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#313131&#34;
                foreground = &#34;#ffffff&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#ffffff&#34;
                graphColor = &#34;#51b7eb&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#51b7eb&#34;
                idleTimeColor = &#34;#ff0000&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#ff0000&#34;
                
                # Make a frametime graph (also support blitting)
                self.fig, self.ax = plt.subplots()
                self.fig.set_size_inches(7, 2)
                # &#34;Remove&#34; the white space around the graph
                self.fig.set_facecolor(background) # Set the background color
                self.ax.set_facecolor(background) # Set the background color
                self.ax.tick_params(axis=&#39;x&#39;, colors=foreground) # Set the axis text color to white
                self.ax.tick_params(axis=&#39;y&#39;, colors=foreground) # Set the axis text color to white
                # Remove the small black lines around the graph
                self.ax.spines[&#39;bottom&#39;].set_color(background)
                self.ax.spines[&#39;top&#39;].set_color(background)
                self.ax.spines[&#39;right&#39;].set_color(background)
                self.ax.spines[&#39;left&#39;].set_color(background)
                
                self.ax.set_ylabel(&#34;Time (ms) Idle (%)&#34;)
                self.ax.yaxis.label.set_color(foreground)
                
                self.ax.set_ylim(0, 100)
                self.ax.set_xlim(0, 100)
                self.ax.set_autoscale_on(False)
                
                self.line, = self.ax.plot(frames, color=graphColor)
                self.idleLine, = self.ax.plot(idleTime, color=idleTimeColor)
                
                self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
                self.canvas.get_tk_widget().grid(row=0, column=0, padx=0, pady=10)
                self.canvas.draw()
            except:
                pass
            
            
        def main(self):
            
            try:
                self.root.destroy() # Load the UI each time this plugin is called
            except: pass
            
            self.root = tk.Canvas(self.master, width=700, height=750, border=0, highlightthickness=0)
            self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
            self.root.pack_propagate(0)
            
            # Helpers provides easy to use functions for creating consistent widgets!
            self.fps = helpers.MakeLabel(self.root, &#34;&#34;, 1,0, font=(&#34;Roboto&#34;, 20, &#34;bold&#34;), padx=30, pady=5, columnspan=1)
            self.cpu = helpers.MakeLabel(self.root, &#34;&#34;, 2,0, font=(&#34;Roboto&#34;, 12), padx=30, pady=2, columnspan=1)
            # Make the list of plugins and their frametimes (can&#39;t be a treeview since that is too slow)
            self.list = tk.Text(self.root, width=60, height=14, font=(&#34;Consolas&#34;, 10))
            self.list.grid(row=3, column=0, padx=30, pady=0, columnspan=1)
            helpers.MakeLabel(self.root, &#34;* all information is for the last frame&#34;, 5,0, font=(&#34;Roboto&#34;, 10), padx=30, pady=10)
            
            self.createGraph()
            
            self.root.pack(anchor=&#34;center&#34;, expand=False)
            self.root.update()
        
        def update(self, data): # When the panel is open this function is called each frame 
            global frames
            global lastUpdateTime
            global lastTheme
            global idleTime
            
            data = data[&#34;last&#34;] # Get last frame&#39;s data
            try:
                lastFrameTime = data[&#34;executionTimes&#34;][&#34;all&#34;]
                fps = 1/lastFrameTime
                ms = lastFrameTime*1000
                self.fps.set(f&#34;{round(fps)} fps ({round(ms, 1)} ms)&#34;)
                
                frames.append(ms)
                if len(frames) &gt; 100:
                    frames.pop(0)
                
                if(time.time() - lastUpdateTime &gt; updateRate):
                    lastUpdateTime = time.time()
                    # Clear the text box and add the new data
                    self.list.delete(&#34;1.0&#34;, &#34;end&#34;)
                    for plugin in data[&#34;executionTimes&#34;]:
                        # Take into account the width to make the values line up 
                        listObject = f&#34;{plugin}:&#34;
                        listObject += &#34; &#34;*(50-len(listObject))
                        listObject += f&#34;{int(data[&#39;executionTimes&#39;][plugin]*1000)} ms&#34;
                        self.list.insert(&#34;end&#34;, listObject + &#34;\n&#34;)

                try:
                    self.updateAxis()
                except Exception as ex:
                    print(ex.args)
                    pass

                try:
                    self.cpu.set(f&#34;Idle Time: {round((data[&#39;executionTimes&#39;][&#39;FPSLimiter&#39;] / lastFrameTime) * 100)}%&#34;)
                    idleTime.append((data[&#39;executionTimes&#39;][&#39;FPSLimiter&#39;] / lastFrameTime) * 100)
                    
                    if len(idleTime) &gt; 100:
                        idleTime.pop(0)
                except:
                    idleTime = []
                    
            except Exception as ex:
                print(ex.args)
    
            if(lastTheme != settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;)):
                lastTheme = settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;)
                self.createGraph()
    
            self.root.update()
            
    
    except Exception as ex:
        print(ex.args)</code></pre>
</details>
<h3>Methods</h3>
<dl>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.createGraph"><code class="name flex">
<span>def <span class="ident">createGraph</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def createGraph(self):
    
    # Try and delete the old graph if it exists
    try:
        self.canvas.get_tk_widget().destroy()
        del self.canvas
        del self.fig
        del self.ax
        del self.line
        
    except: pass
    
    try:
        background = &#34;#313131&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#313131&#34;
        foreground = &#34;#ffffff&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#ffffff&#34;
        graphColor = &#34;#51b7eb&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#51b7eb&#34;
        idleTimeColor = &#34;#ff0000&#34; if settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;) == &#34;dark&#34; else &#34;#ff0000&#34;
        
        # Make a frametime graph (also support blitting)
        self.fig, self.ax = plt.subplots()
        self.fig.set_size_inches(7, 2)
        # &#34;Remove&#34; the white space around the graph
        self.fig.set_facecolor(background) # Set the background color
        self.ax.set_facecolor(background) # Set the background color
        self.ax.tick_params(axis=&#39;x&#39;, colors=foreground) # Set the axis text color to white
        self.ax.tick_params(axis=&#39;y&#39;, colors=foreground) # Set the axis text color to white
        # Remove the small black lines around the graph
        self.ax.spines[&#39;bottom&#39;].set_color(background)
        self.ax.spines[&#39;top&#39;].set_color(background)
        self.ax.spines[&#39;right&#39;].set_color(background)
        self.ax.spines[&#39;left&#39;].set_color(background)
        
        self.ax.set_ylabel(&#34;Time (ms) Idle (%)&#34;)
        self.ax.yaxis.label.set_color(foreground)
        
        self.ax.set_ylim(0, 100)
        self.ax.set_xlim(0, 100)
        self.ax.set_autoscale_on(False)
        
        self.line, = self.ax.plot(frames, color=graphColor)
        self.idleLine, = self.ax.plot(idleTime, color=idleTimeColor)
        
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
        self.canvas.get_tk_widget().grid(row=0, column=0, padx=0, pady=10)
        self.canvas.draw()
    except:
        pass</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.destroy"><code class="name flex">
<span>def <span class="ident">destroy</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def destroy(self):
    self.done = True
    self.root.destroy()
    del self</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.main"><code class="name flex">
<span>def <span class="ident">main</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def main(self):
    
    try:
        self.root.destroy() # Load the UI each time this plugin is called
    except: pass
    
    self.root = tk.Canvas(self.master, width=700, height=750, border=0, highlightthickness=0)
    self.root.grid_propagate(0) # Don&#39;t fit the canvast to the widgets
    self.root.pack_propagate(0)
    
    # Helpers provides easy to use functions for creating consistent widgets!
    self.fps = helpers.MakeLabel(self.root, &#34;&#34;, 1,0, font=(&#34;Roboto&#34;, 20, &#34;bold&#34;), padx=30, pady=5, columnspan=1)
    self.cpu = helpers.MakeLabel(self.root, &#34;&#34;, 2,0, font=(&#34;Roboto&#34;, 12), padx=30, pady=2, columnspan=1)
    # Make the list of plugins and their frametimes (can&#39;t be a treeview since that is too slow)
    self.list = tk.Text(self.root, width=60, height=14, font=(&#34;Consolas&#34;, 10))
    self.list.grid(row=3, column=0, padx=30, pady=0, columnspan=1)
    helpers.MakeLabel(self.root, &#34;* all information is for the last frame&#34;, 5,0, font=(&#34;Roboto&#34;, 10), padx=30, pady=10)
    
    self.createGraph()
    
    self.root.pack(anchor=&#34;center&#34;, expand=False)
    self.root.update()</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.tabFocused"><code class="name flex">
<span>def <span class="ident">tabFocused</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def tabFocused(self):
    mainUI.resizeWindow(900,600)</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.update"><code class="name flex">
<span>def <span class="ident">update</span></span>(<span>self, data)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def update(self, data): # When the panel is open this function is called each frame 
    global frames
    global lastUpdateTime
    global lastTheme
    global idleTime
    
    data = data[&#34;last&#34;] # Get last frame&#39;s data
    try:
        lastFrameTime = data[&#34;executionTimes&#34;][&#34;all&#34;]
        fps = 1/lastFrameTime
        ms = lastFrameTime*1000
        self.fps.set(f&#34;{round(fps)} fps ({round(ms, 1)} ms)&#34;)
        
        frames.append(ms)
        if len(frames) &gt; 100:
            frames.pop(0)
        
        if(time.time() - lastUpdateTime &gt; updateRate):
            lastUpdateTime = time.time()
            # Clear the text box and add the new data
            self.list.delete(&#34;1.0&#34;, &#34;end&#34;)
            for plugin in data[&#34;executionTimes&#34;]:
                # Take into account the width to make the values line up 
                listObject = f&#34;{plugin}:&#34;
                listObject += &#34; &#34;*(50-len(listObject))
                listObject += f&#34;{int(data[&#39;executionTimes&#39;][plugin]*1000)} ms&#34;
                self.list.insert(&#34;end&#34;, listObject + &#34;\n&#34;)

        try:
            self.updateAxis()
        except Exception as ex:
            print(ex.args)
            pass

        try:
            self.cpu.set(f&#34;Idle Time: {round((data[&#39;executionTimes&#39;][&#39;FPSLimiter&#39;] / lastFrameTime) * 100)}%&#34;)
            idleTime.append((data[&#39;executionTimes&#39;][&#39;FPSLimiter&#39;] / lastFrameTime) * 100)
            
            if len(idleTime) &gt; 100:
                idleTime.pop(0)
        except:
            idleTime = []
            
    except Exception as ex:
        print(ex.args)

    if(lastTheme != settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;)):
        lastTheme = settings.GetSettings(&#34;User Interface&#34;, &#34;Theme&#34;)
        self.createGraph()

    self.root.update()</code></pre>
</details>
</dd>
<dt id="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.updateAxis"><code class="name flex">
<span>def <span class="ident">updateAxis</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def updateAxis(self):
    try:
        # Update the axis using blitting to avoid redrawing the whole graph
        # the data is updated in the frames list
        self.line.set_ydata(frames)
        self.line.set_xdata(range(len(frames)))
        self.idleLine.set_ydata(idleTime)
        self.idleLine.set_xdata(range(len(idleTime)))
        self.ax.draw_artist(self.ax.patch)
        self.ax.draw_artist(self.line)
        self.ax.draw_artist(self.idleLine)
        
        self.canvas.blit(self.ax.bbox)
        self.canvas.flush_events()
    except:
        pass</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance" href="index.html">Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI">UI</a></code></h4>
<ul class="two-column">
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.createGraph" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.createGraph">createGraph</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.destroy" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.destroy">destroy</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.main" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.main">main</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.tabFocused" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.tabFocused">tabFocused</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.update" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.update">update</a></code></li>
<li><code><a title="Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.updateAxis" href="#Euro-Truck-Simulator-2-Lane-Assist.plugins.Performance.main.UI.updateAxis">updateAxis</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>